from django.db import models

# Create your models here.

from django.contrib.auth.models import AbstractUser
from core.models import DbAuditModel, ModeTypeAbstract, DbUuidModel


class Users(AbstractUser, DbAuditModel, ModeTypeAbstract):
    username = models.CharField(
        max_length=150,
        unique=True,
        db_index=True,
        verbose_name="用户账号",
        help_text="用户账号",
    )
    email = models.EmailField(
        max_length=255,
        verbose_name="用户邮箱",
        null=True,
        blank=True,
        help_text="用户邮箱",
    )
    nickname = models.CharField(
        max_length=40,
        null=True,
        blank=True,
        verbose_name="用户昵称",
        help_text="用户昵称",
    )
    status = models.BooleanField(default=True, verbose_name="状态", help_text="状态")
    GENDER_CHOICES = (
        (0, "未知"),
        (1, "男"),
        (2, "女"),
    )
    gender = models.IntegerField(
        choices=GENDER_CHOICES,
        default=0,
        verbose_name="性别",
        null=True,
        blank=True,
        help_text="性别",
    )

    class Meta:
        db_table = "system_users"
        verbose_name = "用户管理"
        verbose_name_plural = verbose_name
        ordering = ("id",)

    def __str__(self) -> str:
        return self.username


class Role(DbAuditModel):
    """
    角色表
    """

    name = models.CharField(
        max_length=64, verbose_name="角色名称", help_text="角色名称"
    )
    key = models.CharField(
        max_length=64, unique=True, verbose_name="权限字符", help_text="权限字符"
    )

    class Meta:
        db_table = "system_roles"
        verbose_name = "角色管理"
        verbose_name_plural = verbose_name
        ordering = ("id",)

    def __str__(self):
        return self.name


class UserRoleModel(DbAuditModel):
    """
    用户角色模型类，表示用户和角色之间的多对一关系。

    继承自DbAuditModel，添加了用户和角色的外键关联。

    属性:
        user: ForeignKey，指向Users模型，表示用户。
        role: ForeignKey，指向Role模型，表示角色。
    """

    user = models.ForeignKey(Users, on_delete=models.CASCADE, related_name="roles")
    # 用户外键，当关联的用户被删除时，该用户的角色记录也将被删除。

    role = models.ForeignKey(Role, on_delete=models.CASCADE, related_name="users")
    # 角色外键，当关联的角色被删除时，拥有该角色的用户记录也将被删除。
    STATUS_CHOICES = (
        (1, "正常"),
        (5, "激活"),
        (9, "删除"),
    )
    status = models.IntegerField(
        choices=STATUS_CHOICES,
        default=1,
        verbose_name="状态",
        null=True,
        blank=True,
        help_text="状态",)
    

    class Meta:
        db_table = "system_user_roles"
        # 指定数据库表名为'system_user_roles'。

        verbose_name = "用户角色"
        # 在管理员界面显示的单数名称。

        verbose_name_plural = verbose_name
        # 在管理员界面显示的复数名称。

        ordering = ("id",)
        # 默认排序方式，按照id升序排序。

        unique_together = ("user", "role")
        # 确保每个用户和角色的组合在数据库中是唯一的，防止重复记录。
